package org.eclipse.jdt.ui.tests.refactoring.codingspectator;
import junit.framework.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.ltk.core.refactoring.CheckConditionsOperation;
import org.eclipse.ltk.core.refactoring.Refactoring;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.codingspectator.IWatchedRefactoring;
import org.eclipse.jdt.internal.corext.refactoring.code.ExtractMethodRefactoring;
import org.eclipse.jdt.internal.corext.refactoring.code.InlineMethodRefactoring;
/**
*
* @author Mohsen Vakilian
* @author nchen
*
*/
public class RefactoringChecker {
public static class Result {
/**
* If this field is CheckConditionsOperation.FINAL_CONDITIONS, it means that
* RefactoringChecker has checked the initial conditions and what remains to check are the
* final conditions. And, if this field is CheckConditionsOperation.ALL_CONDITIONS, it means
* that RefactoringChecker hasn't checked any conditions and all conditions remain to be
* checked. Finally, if this field is CheckConditionsOperation.NONE it means that enough
* checks have been performed, e.g. the performed checks have found fatal errors, and there
* is no need to check any further conditions.
*/
int remainingConditionsToCheck;
RefactoringStatus refactoringStatus;
public Result(int remainingConditionsToCheck, RefactoringStatus refactoringStatus) {
super();
Assert.assertNotNull(refactoringStatus);
this.remainingConditionsToCheck= remainingConditionsToCheck;
this.refactoringStatus= refactoringStatus;
}
public int getRemainingConditionsToCheck() {
return remainingConditionsToCheck;
}
public RefactoringStatus getRefactoringStatus() {
return refactoringStatus;
}
}
static int i= 0;
public static Result checkRefactoringDescriptorCreation(final Refactoring refactoring) throws OperationCanceledException, CoreException {
System.out.println("checkRefactoringDescriptorCreation #" + ++i);
int remainingConditionsToCheck= CheckConditionsOperation.ALL_CONDITIONS;
RefactoringStatus refactoringStatus= new RefactoringStatus();
if (refactoring instanceof IWatchedRefactoring) {
IWatchedRefactoring watchedRefactoring= (IWatchedRefactoring)refactoring;
if (watchedRefactoring.isWatched()) {
if (refactoring instanceof InlineMethodRefactoring) {
refactoringStatus.merge(refactoring.checkInitialConditions(new NullProgressMonitor()));
remainingConditionsToCheck= CheckConditionsOperation.FINAL_CONDITIONS;
} else if (refactoring instanceof ExtractMethodRefactoring) {
// We don't execute checkInitialConditions since that would modify its initial settings.
} else {
refactoringStatus.merge(refactoring.checkInitialConditions(new NullProgressMonitor()));
remainingConditionsToCheck= CheckConditionsOperation.FINAL_CONDITIONS;
}
if (refactoringStatus.hasFatalError()) {
//See org.eclipse.ltk.core.refactoring.Refactoring#checkAllConditions(IProgressMonitor)
remainingConditionsToCheck= CheckConditionsOperation.NONE;
} else {
Assert.assertNotNull(watchedRefactoring.getSimpleRefactoringDescriptor(refactoringStatus));
}
}
}
return new Result(remainingConditionsToCheck, refactoringStatus);
}
}